#pragma once

#include <tools/TcpServer/Session.h>
#include "tools/ThreadObj/ThreadCond.h"
#include <list>
#include <thread>
#include <deque>

class XXXSession;
using XXXSessionPtr = std::shared_ptr<XXXSession>;

// 前置声明
class XXXMsgManager;
using XXXMsgManagerPtr = std::shared_ptr<XXXMsgManager>;

// XXX通讯协议
class XXXSession : public Session
{
public:
    XXXSession(std::shared_ptr<tcp::socket> socket);
    ~XXXSession();

    virtual void Start() override;
    virtual void Stop() override;

    virtual void OnRecv(const char* bufData, size_t len) override;

    void DoTask();                                          // 在线程中检查是否有数据需要处理
    void HandleMsg(const std::string& msg);

    void BufDataAppend(const char* bufData, size_t len);    // 缓存数据
    void ClearBufData();                                    // 清空缓存数据

    bool IsMsgListEmpty();                                  // 判断请求队列是否为空
    void ClearMsgList();                                    // 清空请求队列
    void PushMsg(const std::string& msg);                   // 添加请求队列
    std::string PopMsg();                                   // 取出请求队列的第一个请求

protected:
    std::thread m_thread;                           // 任务处理线程
    ThreadCond m_taskCond;                          // 条件变量，触发处理任务  
    bool m_beStop = false;

    std::mutex m_cacheDataMutex;                    // 缓存数据互斥锁
    std::string m_cacheData;                        // 请求数据

    std::mutex m_msgListMutex;                      // 请求队列互斥锁
    std::deque<std::string> m_msgList;              // 请求消息的队列

    XXXMsgManagerPtr m_xxxMsgManager = nullptr;     // 协议的处理者
};